package dominio;

import interfaces.Archivo;
import interfaces.BaseDeDatos;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import utilidades.AppendingObjectOutputStream;

public class PaqueteDeViaje extends Viaje implements Serializable, Archivo, BaseDeDatos {
	protected Hotel hotel;
	protected Integer idPaquete;
	protected Integer Completo;
	protected Float Precio;
	private static final long serialVersionUID = 7033686879614057319L;

	public PaqueteDeViaje(){	
	}
	
	public PaqueteDeViaje(Integer idPaquete, String fechaSalida, String horaSalida,
			String fechaArrivo, String horaArrivo, Integer Completo, Float Precio, Hotel hotel,
			Avion avion, Aeropuerto auropuertaArrivo, Aeropuerto aeropuertoSalida){
		this.idPaquete = idPaquete;
		this.fechaSalida = fechaSalida;
		this.horaSalida = horaSalida;
		this.fechaArrivo = fechaArrivo;
		this.horaArrivo = horaArrivo;
		this.Completo = Completo;
		this.Precio = Precio;
		this.hotel = hotel;
		this.avion = avion;
		this.auropuertaArrivo = auropuertaArrivo;
		this.aeropuertoSalida = aeropuertoSalida;
	}
	
	public PaqueteDeViaje(Integer idPaquete) {
		this.idPaquete = idPaquete;
	}
	
	public String getHotel() {
		return hotel.toString();
	}

	public void setHotel(Hotel hotel) {
		this.hotel = hotel;
	}
	
	public Hotel getObjetoHoteles() {
		return hotel;
	}

	public Integer getIdPaquete() {
		return idPaquete;
	}

	public void setIdPaquete(Integer idPaquete) {
		this.idPaquete = idPaquete;
	}
	
	public Float getPrecio() {
		return Precio;
	}
	
	public Integer getCompleto() {
		return Completo;
	}

	public void setCompleto(Integer completo) {
		Completo = completo;
	}

	public void setPrecio(Float precio) {
		Precio = precio;
	}

	@Override
	public Avion getAvion() {
		// TODO Auto-generated method stub
		return super.getAvion();
	}

	@Override
	public void setAvion(Avion avion) {
		// TODO Auto-generated method stub
		super.setAvion(avion);
	}

	public boolean equals (Object obj) {	 
        if (obj instanceof PaqueteDeViaje) {
        	PaqueteDeViaje tmpPaqueteDeViaje = (PaqueteDeViaje) obj;
        	if (this.idPaquete.equals(tmpPaqueteDeViaje.idPaquete)) { 
        		return true; 
        	} else { 
        		return false; 
        	}
	    } else { 
	    	return false; 
	    }
	}


	// #####################################################################################
	// ###### ARCHIVO ######################################################################
	// #####################################################################################
		public void guardarRegistro() throws IOException {
			File archivo = new File("bin/aplicacion/archivos/paquetes.txt");
			ObjectOutputStream oos = null;
			if (archivo.exists()) { oos = new AppendingObjectOutputStream(
											new BufferedOutputStream(
												new FileOutputStream(archivo,true)));
			} else { oos = new ObjectOutputStream(
								new BufferedOutputStream(
									new FileOutputStream(archivo,true)));
			}	
			oos.writeObject(this);	
			oos.close();	
		}

		@Override
		public List<PaqueteDeViaje> leerRegistros() throws IOException {
			List<PaqueteDeViaje> lista = new ArrayList<PaqueteDeViaje>();
			File file = new File("bin/aplicacion/archivos/paquetes.txt");
			ObjectInputStream ois = null;
			if (file.exists()){
				ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
				try {
					while(true){
						lista.add((PaqueteDeViaje) ois.readObject());
					}
				} catch(EOFException e){		
				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}		
			}
			if(ois != null) ois.close();
			return lista;
		}
		
		@Override
		public int codigoUltimoRegistro() throws IOException, ClassNotFoundException {
			File file = new File("bin/aplicacion/archivos/paquetes.txt");
			ObjectInputStream ois = null;
			PaqueteDeViaje p = null;
			if(file.exists()) {
				ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
				try {
					while(true){
						 p = (PaqueteDeViaje) ois.readObject();
					}
				} catch (EOFException e) {
				}
				if(ois != null)	ois.close();
				return p.getIdPaquete() + 1;
			} else {
				return 1;
			}	
		}
		
		public String stringAeropuertoArrivo(){
			return auropuertaArrivo.getCiudadAeropuerto() + ", " + auropuertaArrivo.getPaisAeropuerto(); 
		}
		
		public String stringAeropuertoSalida(){
			return aeropuertoSalida.getCiudadAeropuerto() + ", " + aeropuertoSalida.getPaisAeropuerto();
		}
		
		public String getNombreAeropuertoArrivo(){
			return auropuertaArrivo.getNombreAeropuerto();
		}
		
		public String getNombreAeropuertoSalida(){
			return aeropuertoSalida.getNombreAeropuerto();
		}
		
		public String stringHotel(){
			return hotel.getNombre();
		}
	
	
	// #####################################################################################
	// ###### BASE DE DATOS ################################################################
	// #####################################################################################	
		@Override
		public List<PaqueteDeViaje> leerRegistrosBD() throws SQLException {
			List<PaqueteDeViaje> lista = new ArrayList<PaqueteDeViaje>();	
			Connection conn = null;
			String query = "select distinct idpaquetedeviaje_pdv, fechasalida_pdv, " +
					"horasalida_pdv,fechaarrivo_pdv, horaarrivo_pdv, " +
					"completo_pdv, precio_pdv, idhotel_h, nombre_h, pais_h, " +
					"provincia_h,ciudad_h,capacidad_h,idavion_a, " +
					"marca_a, modelo_a, capacidad_a, " +
					"arrivo.idaeropuerto_a, arrivo.nombre_a, arrivo.pais_a, arrivo.ciudad_a, " +
					"salida.idaeropuerto_a as idaeropuerto_s, salida.nombre_a as nombre_s, " +
					"salida.pais_a as pais_s, salida.ciudad_a as ciudad_s " +
					"from paquetesdeviaje " +
					"join hoteles on idhotel_h = idhotel_pdv " +
					"join aviones on idavion_a = idavion_pdv " +
					"join aeropuertos arrivo on idaeropuertoarrivo_pdv = arrivo.idaeropuerto_a " +
					"join aeropuertos salida on idaeropuertosalida_pdv = salida.idaeropuerto_a;";
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn = DriverManager.getConnection(host + dbName, user, pass);
			Statement st = conn.createStatement();			
			ResultSet rs = st.executeQuery(query);
			while(rs.next()){
					lista.add(new PaqueteDeViaje(
							rs.getInt("idpaquetedeviaje_pdv"), 
							rs.getString("fechasalida_pdv"), 
							rs.getString("horasalida_pdv"), 
							rs.getString("fechaarrivo_pdv"), 
							rs.getString("horaarrivo_pdv"),
							rs.getInt("completo_pdv"), 
							rs.getFloat("precio_pdv"),
							new Hotel(
								rs.getInt("idhotel_h"), 
								rs.getString("nombre_h"),
								rs.getInt("capacidad_h"),
								rs.getString("pais_h"), 
								rs.getString("provincia_h"), 
								rs.getString("ciudad_h") 		
								),
							new Avion(
								rs.getInt("idavion_a"), 
								rs.getString("marca_a"), 
								rs.getString("modelo_a"), 
								rs.getInt("capacidad_a")
								),
							new Aeropuerto(
								rs.getInt("arrivo.idaeropuerto_a"), 
								rs.getString("arrivo.nombre_a"),
								rs.getString("arrivo.pais_a"),
								rs.getString("arrivo.ciudad_a")
								),
							new Aeropuerto(
								rs.getInt("idaeropuerto_s"),
								rs.getString("nombre_s"), 
								rs.getString("ciudad_s"),
								rs.getString("pais_s")
								)
							)
					);}
			if(conn != null)conn.close();
			return lista;
		}
		@Override
		public void guardarRegistroBd() throws SQLException {
			Connection conn = null;
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn = DriverManager.getConnection(host + dbName, user, pass);
			Statement st = conn.createStatement();		
			String query = "INSERT INTO paquetesdeviaje(idpaquetedeviaje_pdv, idhotel_pdv,"
						+ "idaeropuertosalida_pdv, idaeropuertoarrivo_pdv, fechasalida_pdv," 
						+ "horasalida_pdv, fechaarrivo_pdv, horaarrivo_pdv, "
						+ "completo_pdv, idavion_pdv, precio_pdv)VALUES("
						+ this.idPaquete + ","
						+ this.hotel.getIdHotel() + ","
						+ this.aeropuertoSalida.getIdAeropuerto() + ","
						+ this.auropuertaArrivo.getIdAeropuerto() + ",'"
						+ this.fechaSalida + "','"
						+ this.horaSalida + "','"
						+ this.fechaArrivo + "','"
						+ this.horaArrivo + "',"
						+ this.getAvion().getCapacidadAvion() + ","
						+ this.getAvion().getIdAvion() + ","
						+ this.Precio
						+ ");";
			st.executeUpdate(query);	
			if(conn != null)conn.close();
		}

		@Override
		public PaqueteDeViaje leerRegistroBD(int id) throws SQLException {
			PaqueteDeViaje pdv = null;	
			Connection conn = null;
			String query = "select distinct idpaquetedeviaje_pdv, fechasalida_pdv, " +
					"horasalida_pdv,fechaarrivo_pdv, horaarrivo_pdv, " +
					"completo_pdv, precio_pdv, idhotel_h, nombre_h, pais_h, " +
					"provincia_h,ciudad_h,capacidad_h,idavion_a, " +
					"marca_a, modelo_a, capacidad_a, " +
					"arrivo.idaeropuerto_a, arrivo.nombre_a, arrivo.pais_a, arrivo.ciudad_a, " +
					"salida.idaeropuerto_a as idaeropuerto_s, salida.nombre_a as nombre_s, " +
					"salida.pais_a as pais_s, salida.ciudad_a as ciudad_s " +
					"from paquetesdeviaje " +
					"join hoteles on idhotel_h = idhotel_pdv " +
					"join aviones on idavion_a = idavion_pdv " +
					"join aeropuertos arrivo on idaeropuertoarrivo_pdv = arrivo.idaeropuerto_a " +
					"join aeropuertos salida on idaeropuertosalida_pdv = salida.idaeropuerto_a " +
					"where idpaquetedeviaje_pdv = " + id +";";
			DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			conn = DriverManager.getConnection(host + dbName, user, pass);
			Statement st = conn.createStatement();			
			ResultSet rs = st.executeQuery(query);
			while(rs.next()){
					pdv = new PaqueteDeViaje(
							rs.getInt("idpaquetedeviaje_pdv"), 
							rs.getString("fechasalida_pdv"), 
							rs.getString("horasalida_pdv"), 
							rs.getString("fechaarrivo_pdv"), 
							rs.getString("horaarrivo_pdv"),
							rs.getInt("completo_pdv"), 
							rs.getFloat("precio_pdv"),
							new Hotel(
								rs.getInt("idhotel_h"), 
								rs.getString("nombre_h"),
								rs.getInt("capacidad_h"),
								rs.getString("pais_h"), 
								rs.getString("provincia_h"), 
								rs.getString("ciudad_h") 		
								),
							new Avion(
								rs.getInt("idavion_a"), 
								rs.getString("marca_a"), 
								rs.getString("modelo_a"), 
								rs.getInt("capacidad_a")
								),
							new Aeropuerto(
								rs.getInt("arrivo.idaeropuerto_a"), 
								rs.getString("arrivo.nombre_a"),
								rs.getString("arrivo.pais_a"),
								rs.getString("arrivo.ciudad_a")
								),
							new Aeropuerto(
								rs.getInt("idaeropuerto_s"),
								rs.getString("nombre_s"), 
								rs.getString("ciudad_s"),
								rs.getString("pais_s")
								)
							)
					;}
			if(conn != null)conn.close();
			return pdv;
		}

		@Override
		public void actualizarRegistroBd() throws SQLException {
			// TODO Auto-generated method stub
			
		}
		
		
}
